package com.sky.chapter3.lock;

/**
 * @author : wushikai
 * <p>
 * date : 2022-07-04
 * 多个线程竞争 同一个实例
 */
class synchronizedDemo1 {


    private int num = 0;



    /**
     * 实例对象锁就是用synchronized修饰实例对象的实例方法，注意是实例方法
     * 多个线程对象 ( t1, t2 ) 竞争  同一个 其他类的对象实例  即 synchronizedDemo1 的 num ;
     *
     *修饰实例方法，作用于当前实例，进入同步代码前需要先获取实例即:synchronizedDemo1 对象 的锁
     * */
    private synchronized void safeAdd() {
        num++;
    }

    private void notSafeAdd(){

        num++ ;
    }



    private static class MyThread extends Thread {
        private synchronizedDemo1 synchronizedDemo1;

        MyThread(synchronizedDemo1 synchronizedDemo1) {
            this.synchronizedDemo1 = synchronizedDemo1;
        }


        /**
         * 可以对比下两者的差别; 一个 是得到 20000 另一个是得到一个随机数值;
         * */
        @Override
        public void run() {
            for (int i = 0; i < 10000; i++) {
                this.synchronizedDemo1.safeAdd();
               // this.synchronizedDemo1.notSafeAdd();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        synchronizedDemo1 synchronizedDemo1 = new synchronizedDemo1();
        MyThread t1 = new MyThread(synchronizedDemo1);
        MyThread t2 = new MyThread(synchronizedDemo1);
        t1.start();
        t2.start();
        t1.join();
        t2.join();


        System.out.println(synchronizedDemo1.num);
    }
}
